package com.fusion.task.service.impl;

import java.util.HashMap;
import java.util.Map;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fusion.task.service.JobTaskCallBackService;
import com.fusion.task.service.JobTaskService;
import com.fusion.task.util.SpringUtil;

/**
 * @Description: 定时任务管理实现
 * @author: 赵兴炎
 * @date: 2019年7月2日
 */
@Service
public class JobTaskServiceImpl implements JobTaskService {

	@Autowired
	private Scheduler scheduler;
	@Autowired(required = false)
	private JobTaskCallBackService taskCallBackService;
	
	/**
	 * @Description: 任务启动方法
	 * @param name 任务名字（唯一标识，对应spring容器中类的名字）
	 * @param group 任务组的名字
	 * @param cron 任务执行规则
	 * @param hashMap 参数接收
	 * @author: 赵兴炎
	 * @date: 2019年7月2日
	 * @return: 无
	 */
	@Override
	public void startTask(String name, String group, String cron, Map<String, Object> hashMap) {
		JobDataMap jobDataMap = null;
		if (hashMap != null && hashMap.size() > 0) {
			jobDataMap = new JobDataMap(hashMap);
		} else {
			jobDataMap = new JobDataMap(new HashMap<>());
		}
		if (group == null || group.trim().length() == 0)
			group = name;
		Map<String, Job> beansOfType = SpringUtil.getBeansOfType(Job.class);
		JobDetail jobDetail = JobBuilder.newJob(beansOfType.get(name).getClass()).withIdentity(name, group).build();
		CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, group).usingJobData(jobDataMap)
				.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
		try {
			scheduler.scheduleJob(jobDetail, cronTrigger);
			if (!scheduler.isStarted()) {
				scheduler.start();
			}
			if (taskCallBackService != null) {
				taskCallBackService.startTaskCallBack(jobDetail.getKey());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: 修改任务方法
	 * @param name 任务名字（唯一标识，对应spring容器中类的名字）
	 * @param group 任务组的名字
	 * @param cron 任务执行规则
	 * @param hashMap 参数接收
	 * @author: 赵兴炎
	 * @date: 2019年7月2日
	 * @return: 无
	 */
	@Override
	public void updateTaskCron(String name, String group, String cron, Map<String, Object> hashMap) {
		JobDataMap jobDataMap = null;
		if (hashMap != null && hashMap.size() > 0) {
			jobDataMap = new JobDataMap(hashMap);
		} else {
			jobDataMap = new JobDataMap(new HashMap<>());
		}
		if (group == null || group.trim().length() == 0)
			group = name;
		try {
			TriggerKey triggerKey = new TriggerKey(name, group);
			CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
			CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group).usingJobData(jobDataMap)
					.withSchedule(cronScheduleBuilder).build();
			scheduler.rescheduleJob(triggerKey, trigger);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: 暂停任务的方法
	 * @param name 任务名字（唯一标识，对应spring容器中类的名字）
	 * @param group 任务组的名字
	 * @author: 赵兴炎
	 * @date: 2019年7月2日
	 * @return: 无
	 */
	@Override
	public void suspendedTask(String name, String group) {
		if (group == null || group.trim().length() == 0)
			group = name;
		try {
			JobKey jobKey = new JobKey(name, group);
			scheduler.pauseJob(jobKey);
			if (taskCallBackService != null) {
				taskCallBackService.suspendedTasCallBackk(jobKey);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: 恢复任务的方法
	 * @param name 任务名字（唯一标识，对应spring容器中类的名字）
	 * @param group 任务组的名字
	 * @author: 赵兴炎
	 * @date: 2019年7月2日
	 * @return: 无
	 */
	@Override
	public void restoreTask(String name, String group) {
		if (group == null || group.trim().length() == 0)
			group = name;
		try {
			JobKey jobKey = new JobKey(name, group);
			scheduler.resumeJob(jobKey);
			if (taskCallBackService != null) {
				taskCallBackService.restoreTaskCallBack(jobKey);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * @Description: 删除任务的方法
	 * @param name 任务名字（唯一标识，对应spring容器中类的名字）
	 * @param group 任务组的名字
	 * @author: 赵兴炎
	 * @date: 2019年7月2日
	 * @return: 无
	 */
	@Override
	public void deletTask(String name, String group) {
		if (group == null || group.trim().length() == 0)
			group = name;
		try {
			JobKey jobKey = new JobKey(name, group);
			TriggerKey triggerKey = TriggerKey.triggerKey(name, name);
			scheduler.pauseTrigger(triggerKey);
			scheduler.unscheduleJob(triggerKey);
			scheduler.deleteJob(jobKey);
			if (taskCallBackService != null) {
				taskCallBackService.deletTaskCallBack(jobKey);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
